package com.framework.config;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Description: 拦截器，拦截除login的所有接口,配置跨域
 * @author: 姚佳飞
 * @createTime: 2023/12/10 17:50
 */

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

    @Bean
    public SaServletFilter getSaServletFilter(){
        return new SaServletFilter()
            // 拦截地址
            .addInclude("/**")
        // 认证函数: 每次请求执行
            .setAuth(obj -> {
                System.out.println("---------- 进入Sa-Token全局认证 -----------");
                // 登录认证 -- 拦截所有路由，并排除/auth/login 用于登录，/minio/commentUpload用于普通文件上传
                SaRouter.match("/**").notMatch("/auth/login","/minio/commentUpload").check(StpUtil::checkLogin);
            })

             // 异常处理函数：每次认证函数发生异常时执行此函数
            .setError(e->{
                return SaResult.error(e.getMessage());
            })

            // 前置函数：在每次认证函数之前执行
            .setBeforeAuth(obj->{
                SaHolder.getResponse()
                        // ---------- 设置跨域响应头 ----------
                        // 允许指定域访问跨域资源
                        .setHeader("Access-Control-Allow-Origin", "*")
                        // 允许所有请求方式
                        .setHeader("Access-Control-Allow-Methods", "*")
                        // 是否启用浏览器默认XSS防护： 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时，停止渲染页面
                        .setHeader("X-XSS-Protection", "1; mode=block")
                        // 允许的header参数
                        .setHeader("Access-Control-Allow-Headers", "*");
            });
    }

}
